import axios from 'axios'
import {MessageBox} from 'element-ui'
import store from '@/store'
import Qs from 'qs';
import { getToken } from '@/utils/auth'

axios.defaults.withCredentials = true;// 允许跨域携带cookie
axios.defaults.headers['X-Requested-With']='XMLHttpRequest';
axios.defaults.baseURL =  process.env.VUE_APP_BASE_API;//添加请求基础路径
// axios.defaults.timeout = 10000;

/*
 *  todo 配置请求拦截器
 */
axios.interceptors.request.use(
  config=>{
    //后续的加密写在这里
    //携带token
    if (getToken()){
      config.headers['Authentication' ] = 'Bearer ' + getToken();
    }
    //添加时间戳防止请求缓存(会导致数组组装错误)
    // if (config.method == 'post') {
    //   config.data = {
    //     _t: Date.parse(new Date()) / 1000,
    //     ...config.data,
    //   }
    // } else if (config.method == 'get') {
    //   config.params = {
    //     _t: Date.parse(new Date()) / 1000,
    //     ...config.params
    //   }
    // }
    return config;
  },
  error => {
    return Promise.reject(error.response);
  });

/*
 * todo 响应拦截器
 */
axios.interceptors.response.use(
  function (response){
    //响应后的统一处理处理
    return response;
  },
  function (error) {
    //响应错误的情况，后续的所有拦截写在这里
    if(error){
      let res = error.response.data;
      if (res.status==401 && res.error=="Unauthorized"){
        MessageBox.confirm('登录状态已过期，您可以继续留在该页面，或者重新登录', '系统提示', {
            confirmButtonText: '重新登录',
            cancelButtonText: '取消',
            type: 'warning'
          }
        ).then(() => {
          store.dispatch('FedLogOut').then(() => {
            location.href = '/index';
          })
        })
      }
      if (res.status == 403 && res.message == "noauth"){
        location.href = '/401';
      }
      if (res.status == 500){
        MessageBox.confirm('服务器异常，请联系管理员', '警告', {
          type: 'error',
        }).then(()=>{}).catch(()=>{})
      }
      return Promise.reject(error.response)
    }
  }
);

/**
 * todo axios配置参数
 * @type {{method: string, contentType: string}}
 */
export function axiosOptions(method,contentType,responseType){
  var object = new Object();
  object.method=method;
  object.contentType=contentType;
  object.responseType = responseType;
  return object;
}

/*
  todo 暴露请求对象
 */
export const axiosRequest=(url,postData={},options={})=>{
  return new Promise((resolve, reject) => {
    axios({
      method: (options && options.method) || 'post',
      url: isGetUrl(url,options.method),
      params:isGet(postData,options.method),
      data: postData,
      /*处理request数据*/
      transformRequest: [function (data) {
        if (options && options.contentType) {
          return JSON.stringify(data);
        }
        else {
          return Qs.stringify(data, { indices: false })
        }
      }],
      headers: {
        'Content-Type': (options && options.contentType) || 'application/x-www-form-urlencoded;charset=UTF-8'
      },
      responseType:(options && options.responseType) || 'json'
    }).then((res) => {
      if (options.responseType){
        resolve(res);
      }else{
        let response = res.data;
        resolve(response);
      }
    }).catch((error) => {
      reject(error)
    })
  })
}

function isGet(data,method){
  if(method && method=='get'){
    return data;
  }else{
    return null;
  }
}

function isGetUrl(url,method){
  if (method && method=='get'){
    return url+"?_t="+Date.parse(new Date()) / 1000
  }else {
    return url;
  }
}
